﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AgileSaude.Entities
{
    public class Resultado
    {
        #region Propriedades

        /// <summary>
        /// Status que informa se a operação ocorreu com sucesso
        /// </summary>
        public bool Sucesso { get; set; }
        
        /// <summary>
        /// Lista dos campos e mensagens de validação
        /// </summary>
        public List<Mensagem> Mensagens{get; set;}

        /// <summary>
        /// Identificador único dos resultado
        /// </summary>
        public int NumError{ get; set;}

        public int Id { get; set; }

        public string Metodo { get; set; }

        #endregion

        #region Construtores
        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="sucesso">Sucesso.</param>
        /// <param name="mensagens">Mensagens.</param>
        /// <param name="id">Id.</param>
        public Resultado(bool sucesso, List<Mensagem> mensagens, int id)
        {
            this.Sucesso = sucesso;
            this.Mensagens = mensagens;
            this.Id = id;
        }

        /// <summary>
        /// Construtor vazio da classe.
        /// </summary>
        public Resultado()
            : this(false, new List<Mensagem>(), int.MinValue)
        {

        }
        #endregion

        #region Métodos Estáticos
        public static Resultado operator +(Resultado value1, Resultado value2)
        {
            Merge(value1, value2);
            return new Resultado((value1.Sucesso && value2.Sucesso), value1.Mensagens, value1.Id);
        }

        private static void Merge(Resultado value1, Resultado value2)
        {
            foreach (Mensagem mensagem in value2.Mensagens)
            {
                if (!value1.Mensagens.Exists(
                    delegate(Mensagem m)
                    {
                        return m.Descricoes.Exists(
                            delegate(string s)
                            {
                                return mensagem.Descricoes.Contains(s);
                            });
                    }))
                {
                    value1.Mensagens.Add(mensagem);
                }
            }
        }
        #endregion

        public string ConvertMensagensToText()
        {
            string text="";

            foreach (Mensagem msg in Mensagens)
                foreach (string s in msg.Descricoes)
                    text += (string.IsNullOrEmpty(text) ? "" : "<br/>") + s;

            return text;
        }

    }
}
